﻿/*
 * Создан: Оникийчук Антон Игоревич
 * Компания: ООО "ИМСАТ"
 * Дата создания: 21.01.2009
 * Время создания: 10:39
 * Emal разработчика: onikiychuka@gmail.com
 */
using System;
using System.Collections.ObjectModel;

namespace IMSAT.OFTD.DOM
{
    /// <summary>
    /// Коллекция XMLNamespaceManager
    /// </summary>
    public class XmlNamespaceManagerCollection : ObservableCollection<XmlNamespaceManager>
    {
        private readonly Node _owner;

        public XmlNamespaceManagerCollection(Node owner)
        {
            _owner = owner;
        }

        /// <summary>
        /// Узел дерева, к которму относится коллекция менеджеров пространств имен.
        /// </summary>
        public Node Owner
        {
            get { return _owner; }
        }

        /// <summary>
        /// Функция для проверки наличия элемента 
        /// заданного типа в коллекции.
        /// </summary>
        /// <param name="item">объект указанного типа</param>
        /// <returns>true если есть</returns>
        protected virtual bool CheckItem(XmlNamespaceManager item)
        {
            foreach (XmlNamespaceManager ns in this)
            {
                if (ns.FullName == item.FullName)
                    return true;
            }
            return false;
        }


        protected override void InsertItem(int index, XmlNamespaceManager item)
        {
            if (CheckItem(item))
            {
                throw new ArgumentException("Объект заднного типа присутсвует в коллекции", "item");
            }
            base.InsertItem(index, item);
        }

        protected override void SetItem(int index, XmlNamespaceManager item)
        {
            foreach (XmlNamespaceManager ns in this)
            {
                if (ns.FullName == item.FullName)
                {
                    if (index != IndexOf(ns))
                        throw new ArgumentException("Объект заднного типа присутсвует в коллекции", "item");
                }
            }
            base.SetItem(index, item);
        }

        /// <summary>
        /// Проверяет есть ли объект типа T в коллекции
        /// </summary>
        /// <returns>true если есть</returns>
        public bool CheckType<T>() where T : XmlNamespaceManager, new()
        {
            var item = new T();
            return CheckItem(item);
        }

        /// <summary>
        /// Возвращает объект указанного типа из коллекции.
        /// Если объект не найден возбуждаентся исключение ArgumentException
        /// </summary>
        /// <returns>Объект</returns>
        public T GetXmlNamespaceManagerByType<T>() where T : XmlNamespaceManager
        {
            foreach (XmlNamespaceManager ns in this)
            {
                if (ns is T)
                    return ns as T;
            }
            throw new ArgumentException("Не могу найти в коллекции элемент заднного типа", "T");
        }

        /// <summary>
        /// Возвращает объект указанного типа из коллекции.
        /// Если объект не найден в коллекцию добавляется объект этого типа.
        /// </summary>
        /// <returns>объект</returns>
        public T GetXmlNamespaceManagerByTypeSafe<T>() where T : XmlNamespaceManager, new()
        {
            foreach (XmlNamespaceManager ns in this)
            {
                if (ns is T)
                    return ns as T;
            }
            var item = new T();
            Add(item);
            return item;
        }

        /// <summary>
        /// Удалить объект заданного типа из коллекции.
        /// </summary>
        public void Remove<T>() where T : XmlNamespaceManager
        {
            T it = null;
            foreach (XmlNamespaceManager ns in this)
            {
                if (typeof (T).FullName == ns.FullName)
                    it = ns as T;
            }
            if (it != null)
                Remove(it);
        }
    }
}